package it.clariter.dao;

import it.clariter.connection.MyConnection;
import it.clariter.model.Ruolo;
import it.clariter.model.Utente;
import it.clariter.web.action.ActionConstants;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class UtenteDAO  {

	public int insert(Utente utente)
	{
		Connection c=null;
		PreparedStatement ps=null;
		int result=0;
		MessageDigest md=null;
        try {
            //we use MD5 Algorithm
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        md.update(utente.getPassword().getBytes());
        utente.setPassword(new String(md.digest()));
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("INSERT INTO "+DaoConstants.NOME_TABELLA_UTENTE+" SET "+DaoConstants.COLONNA_NOME_UTENTE+"=?,"+DaoConstants.COLONNA_COGNOME_UTENTE+"=?,"+DaoConstants.COLONNA_LOGIN_UTENTE+"=?,"+DaoConstants.COLONNA_PASSWORD_UTENTE+"=?,"+DaoConstants.COLONNA_DATA_ISCRIZIONE_UTENTE+"=?,"+DaoConstants.COLONNA_STATO_UTENTE+"=?,"+DaoConstants.COLONNA_MAIL_UTENTE+"=?,"+DaoConstants.COLONNA_RUOLO_UTENTE+"=?");
			ps.setString(1, utente.getNome());
			ps.setString(2, utente.getCognome());
			ps.setString(3, utente.getLogin());
			ps.setString(4, utente.getPassword());
			ps.setDate(5, new Date(utente.getDataIscrizione().getTime()));
			ps.setInt(6, utente.getStato());
			ps.setString(7, utente.getIndirizzoMail());
			ps.setInt(8, utente.getRuolo().getIdRuolo());
			result=ps.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return result;
	}
	public int update(Utente utente, boolean criptaPassword)
	{
		Connection c=null;
		PreparedStatement ps=null;
		int result=0;
		MessageDigest md=null;
        try {
            //we use MD5 Algorithm
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        if(criptaPassword) {
        	md.update(utente.getPassword().getBytes());
        	utente.setPassword(new String(md.digest()));
        }
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("UPDATE "+DaoConstants.NOME_TABELLA_UTENTE+" SET "+DaoConstants.COLONNA_NOME_UTENTE+"=?,"+DaoConstants.COLONNA_COGNOME_UTENTE+"=?,"+DaoConstants.COLONNA_LOGIN_UTENTE+"=?,"+DaoConstants.COLONNA_PASSWORD_UTENTE+"=?,"+DaoConstants.COLONNA_DATA_ISCRIZIONE_UTENTE+"=?,"+DaoConstants.COLONNA_STATO_UTENTE+"=?,"+DaoConstants.COLONNA_MAIL_UTENTE+"=?,"+DaoConstants.COLONNA_RUOLO_UTENTE+"=? WHERE "+DaoConstants.COLONNA_ID_UTENTE+"=?");
			ps.setString(1, utente.getNome());
			ps.setString(2, utente.getCognome());
			ps.setString(3, utente.getLogin());
			ps.setString(4, utente.getPassword());
			ps.setDate(5, new Date(utente.getDataIscrizione().getTime()));
			ps.setInt(6, utente.getStato());
			ps.setString(7, utente.getIndirizzoMail());
			ps.setInt(8, utente.getRuolo().getIdRuolo());
			ps.setInt(9, utente.getIdUtente());
			result=ps.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return result;
	}
	public int delete(int idva)
	{
		Connection c=null;
		PreparedStatement ps=null;
		int result=0;
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("DELETE FROM "+DaoConstants.NOME_TABELLA_UTENTE+" WHERE "+DaoConstants.COLONNA_ID_UTENTE+"=?");
			ps.setInt(1, idva);
			result=ps.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return result;
	}
	public List<Utente>getList()
	{
		Connection c=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		List <Utente>list=new ArrayList<Utente>();
		Utente utente=null;
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("SELECT * FROM "+DaoConstants.NOME_TABELLA_UTENTE+","+DaoConstants.NOME_TABELLA_RUOLO+" WHERE "+DaoConstants.COLONNA_ID_UTENTE+"="+DaoConstants.COLONNA_RUOLO_UTENTE);
			rs=ps.executeQuery();
			while(rs.next())
			{
				utente=new Utente();
				utente=makeObject(utente,rs);
				list.add(utente);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				rs.close();
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return list;
	}
	public Utente get(Utente utente)
	{
		Connection c=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		Utente utente1=null;
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("SELECT * FROM "+DaoConstants.NOME_TABELLA_UTENTE+","+DaoConstants.NOME_TABELLA_RUOLO+" WHERE "+DaoConstants.COLONNA_ID_RUOLO+"="+DaoConstants.COLONNA_RUOLO_UTENTE+" AND "+DaoConstants.COLONNA_ID_UTENTE+"=?");
			ps.setInt(1, utente.getIdUtente());
			rs=ps.executeQuery();
			if(rs.next())
			{
				utente1=new Utente();
				utente1=makeObject(utente,rs);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				rs.close();
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return utente1;
	}
	public Utente findByLoginEPassword(Utente utente)
	{
		Connection c=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		Utente utente1=null;
		MessageDigest md=null;
        try {
            //we use MD5 Algorithm
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        md.update(utente.getPassword().getBytes());
        utente.setPassword(new String(md.digest()));
		try
		{
			c=MyConnection.getConnection();
			ps=c.prepareStatement("SELECT * FROM "+DaoConstants.NOME_TABELLA_UTENTE+","+DaoConstants.NOME_TABELLA_RUOLO+" WHERE "+DaoConstants.COLONNA_ID_RUOLO+"="+DaoConstants.COLONNA_RUOLO_UTENTE+" AND "+DaoConstants.COLONNA_LOGIN_UTENTE+"=? AND "+DaoConstants.COLONNA_PASSWORD_UTENTE+"=? AND "+DaoConstants.COLONNA_STATO_UTENTE+"="+ActionConstants.STATO_ATTIVO);
			ps.setString(1, utente.getLogin());
			ps.setString(2, utente.getPassword());
			rs=ps.executeQuery();
			if(rs.next())
			{
				utente1=new Utente();
				utente1=makeObject(utente1,rs);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				rs.close();
				ps.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return utente1;
	}
	public List<Utente> findByExample(Utente utente)
	{
		Connection c=null;
		Statement stm=null;
		ResultSet rs=null;
		Utente utente1=null;
		List<Utente>list=new ArrayList<Utente>();
		String query="SELECT * FROM "+DaoConstants.NOME_TABELLA_UTENTE+","+DaoConstants.NOME_TABELLA_RUOLO+" WHERE "+DaoConstants.COLONNA_ID_RUOLO+"="+DaoConstants.COLONNA_RUOLO_UTENTE;
		try
		{
			c=MyConnection.getConnection();
			if((utente.getNome()!=null)&&(!(utente.getNome().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_NOME_UTENTE+" LIKE '"+utente.getNome()+"%' ";
			}
			if((utente.getCognome()!=null)&&(!(utente.getCognome().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_COGNOME_UTENTE+" LIKE '"+utente.getCognome()+"%' ";
			}
			if((utente.getLogin()!=null)&&(!(utente.getLogin().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_LOGIN_UTENTE+" LIKE '"+utente.getLogin()+"%' ";
			}
			if((utente.getDataIscrizione()!=null)&&(!(utente.getDataIscrizione().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_DATA_ISCRIZIONE_UTENTE+" LIKE '"+utente.getDataIscrizione()+"%' ";
			}
			if(!(utente.getStato()==0))
			{
				query=query+" AND "+DaoConstants.COLONNA_STATO_UTENTE+"="+utente.getStato();
			}
			if((utente.getIndirizzoMail()!=null)&&(!(utente.getIndirizzoMail().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_MAIL_UTENTE+" LIKE '"+utente.getIndirizzoMail()+"%' ";
			}
			if(utente.getRuolo() != null && (utente.getRuolo().getCodiceRuolo()!=null)&&(!(utente.getRuolo().getCodiceRuolo().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_CODICE_RUOLO+" LIKE '"+utente.getRuolo().getCodiceRuolo()+"%' ";
			}
			if(utente.getRuolo() != null && (utente.getRuolo().getDescrizioneRuolo()!=null)&&(!(utente.getRuolo().getDescrizioneRuolo().equals(""))))
			{
				query=query+" AND "+DaoConstants.COLONNA_DESCRIZIONE_RUOLO+" LIKE '"+utente.getRuolo().getDescrizioneRuolo()+"%' ";
			}
			stm=c.createStatement();
			rs=stm.executeQuery(query);
			while(rs.next())
			{
				utente1=new Utente();
				utente1=makeObject(utente1,rs);
				list.add(utente1);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				rs.close();
				stm.close();
				c.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return list;
	}
	public Utente makeObject(Utente utente,ResultSet rs) throws SQLException
	{
		Ruolo ruolo=new Ruolo();
		ruolo=new RuoloDAO().makeObject(ruolo, rs);
		utente.setRuolo(ruolo);
		utente.setIdUtente(rs.getInt(DaoConstants.COLONNA_ID_UTENTE));
		utente.setNome(rs.getString(DaoConstants.COLONNA_NOME_UTENTE));
		utente.setCognome(rs.getString(DaoConstants.COLONNA_COGNOME_UTENTE));
		utente.setLogin(rs.getString(DaoConstants.COLONNA_LOGIN_UTENTE));
		utente.setPassword(rs.getString(DaoConstants.COLONNA_PASSWORD_UTENTE));
		utente.setDataIscrizione(rs.getDate(DaoConstants.COLONNA_DATA_ISCRIZIONE_UTENTE));
		utente.setStato(rs.getInt(DaoConstants.COLONNA_STATO_UTENTE));
		utente.setIndirizzoMail(rs.getString(DaoConstants.COLONNA_MAIL_UTENTE));
		return utente;
	} 

}
